/**
 * Author : cheneyliu.
 * Date   : 2016/9/28.
 * File   : travel-api.js.
 */

import Vue from 'vue'
import VueResource from 'vue-resource'
import CryptoJS from 'crypto-js'
import { Toast } from 'mint-ui';
// import message from './components/message';
import config from './config';

var proxyTable = config.proxyTable

var clientId = 'F05D17AF3AE84192A93D478B21BFB5D0'
var headerKey = 'youyou-head-params'
var api = {
  // 授权接口
  oauth: {
    /**
     * 管理员登录
     * loginName (string): 账号 ,
     * password (string): 密码 ,
     * role (string, optional): 管理员角色,0=旅行社账户, 1 = 后台审核, 2 =前端售票
     */
    adminLogin: '/youyou/system/admin/login'
  },
  // 外部接口
  outer: {
    //Travel-旅行社操作接口~~~~~~~~~~~~~~~~
    /**
     * 云中心管理员删除
     * userId (string): 管理员ID
     */
    adminDelete:'/youyou/system/admin/delete',

    /**
     * 云中心管理员密码重置
     * userId (string): 管理员ID
     */
    adminPasswordReset:'/youyou/system/admin/password/reset',

    /**
     * 管理员新增
     * account (string): 管理员账号，限输入字母、数字 ,
     * contactAddress (string, optional): 练习地址 ,
     * idCard (string): 身份证号
     * isFillIn (string, optional): 是否录入员 ,
     * isGuide (string, optional): 是否导游 ,
     * phone (string): 手机号
     * roleId (integer): 注册用户类型（0=旅行社管理员, 1 = 后台审核 2 =前端售票） ,
     * telephonePhone (string, optional): 联系电话 ,
     * travelId (string, optional): 旅行社ID ,
     * travelName (string, optional): 旅行社名称 ,
     * userName (string): 管理员姓名
     */
    adminAdd:'/youyou/system/admin/add',

    /**
     * 管理员列表
     */
    adminList:'/youyou/system/admin/user/list',

    /**
     * 管理员详情
     * userId (string): 管理员ID
     */
    adminDetailGet:'/youyou/system/admin/user/detail/get',

    /**
     * 管理员信息修改
     * account (string): 管理员账号，限输入字母、数字 ,
     * contactAddress (string, optional): 练习地址 ,
     * idCard (string): 身份证号
     * isDisable (string, optional): 是否启动 ,
     * isFillIn (string, optional): 是否录入员 ,
     * isGuide (string, optional): 是否导游 ,
     * name (string, optional): 管理员姓名 ,
     * phone (string): 手机号
     * roleId (string, optional): 管理员角色 ,
     * status (string, optional): 状态 ,
     * telephonePhone (string, optional): 联系电话 ,
     * userId (string): 管理员ID
     */
    adminUserUpdate:'/youyou/system/admin/user/update',


    /**
     * 运维人员/云中心管理员密码修改
     * newPwd (string): 新密码 ,
     * oldPwd (string): 旧密码
     */
    adminPasswordUpdate:'/youyou/system/admin/password/update',

    //travel-admin-controller : Travel-旅行社操作接口

    /**
     * 旅行社添加
     * desc (string, optional): 旅行社描述 ,
     * name (string): 旅行社名称
     */
    travelAdd:'/youyou/admin/travel/add',


    /**
     * 旅行社群组添加
     * groupName (string, optional): 群组名称
     */
    travelGroupAdd:'/youyou/admin/travel/group/add',

    /**
     * 旅行社群组删除
     * groupId (string, optional): 群组ID
     */
    travelGroupDelete:'/youyou/admin/travel/group/delete',

    /**
     * 旅行社群组查询
     */
    travelGroupList:'/youyou/admin/travel/group/list',

    /**
     * 旅行社群组修改
     * groupId (string, optional): 群组ID ,
     * groupName (string, optional): 群组名称
     */
    travelGroupUpdate:'/youyou/admin/travel/group/update',


    /*
     * 旅行社导游列表
     */
    traveGuideList:'/youyou/admin/travel/guide/list',

    /**
     * 旅行社列表
     * travelName (string, optional): 旅行社名称
     */
    travelList:'/youyou/admin/travel/list',

    /**
     * 订单删除
     * orderId (string): 订单ID
     */
    travelOrderDelete:'/youyou/admin/travel/order/delete',

    /**
     * 旅行社订单下载
     * orderId (string): 订单ID
     */
    travelOrderDownload:'/youyou/admin/travel/order/download',

    /**
     * 订单列表
     * orderName (string, optional): 订单名称
     */
    travelOrderList:'/youyou/admin/travel/order/list',

    /**
     * 旅行社添加订单
     * arriveTime (string): 到达时间 ,
     * guideUserId (string): 导游ID ,
     * inChannel (string): 入园通道 0=东门，1=西门 ,
     * inDate (string): 入园日期 ,
     * isAdjust (string): 是否接受景区入园调整 T=接受 F=不接受 ,
     * orderList (Array[Map«string,string»]): 订单列表 示例：[ {"passengerName":"黄飞飞","touristDestination":"福建省","isAccommodation":"0","papersType":"01","idCard":"350784199402210013","phone":"18695604770","specialPapersId":"0","auditResult":"成人","itemNo":"A00028","itemName":"普通通道管理卡","unitPrice":0}, {"passengerName":"李飞飞","touristDestination":"福建省","isAccommodation":"0""papersType":"01","idCard":"350784199402220013","phone":"11121221211","specialPapersId":"1","auditResult":"成人","itemNo":"A00400034","itemName":"小七孔全票(旺)","unitPrice":130} ] ,
     * orderName (string): 订单名称 ,
     * plateNumber (string): 车牌号 ,
     * remark (string, optional): 旅行社申请其他事项
     */
    travelOrderPassengerAdd:'/youyou/admin/travel/order/passenger/add',

    /**
     * 旅行社订单详情
     * orderId (string): 订单ID
     */
    travelOrderDetail:'/youyou/admin/travel/order/get',

    /**
     * 九天达订单详情
     */
    travelJTDOrderList:'/youyou/admin/travel/jtd/order/get',

    /**
     * 分页订单列表
     * endDate (string, optional): 结束日期 ,
     * guideName (string, optional): 导游名称 ,
     * inDate (string, optional): 人园日期 ,
     * orderName (string, optional): 订单名称 ,
     * orderNo (string, optional): 单号查询 ,
     * page (integer): 当前显示页，取值范围[1,10000000]。 ,
     * pageSize (integer): 每页显示条数，取值范围[1,100]。 ,
     * startDate (string, optional): 开始日期
     * res{status: 订单状态
     * 0 = 待审核
     * 1 = 审核通过
     * 2 = 审核不通过
     * 3 = 草稿}
     */
    travelOrderPageList: '/youyou/admin/travel/order/page/list',

    /**
     * 旅行社订单撤销
     * orderId (string): 旅行社名称
     */
    travelOrderUndo: '/youyou/admin/travel/order/undo',

    /**
     * 订单申请撤回
     * @date 2019-01-31
     * orderId (string): 旅行社ID
     */
    travelOrderApplyWithdraw: '/youyou/admin/travel/order/apply/withdraw',

    // Travel-Audit-旅行社后台审核接口~~~~~~~~~~~~~~~

    /**
     * 订单产品类型列表
     * date (string): 日期
     */
    travelOrderItemList:'/youyou/admin/travel/order/item/list',

    /**
     * 旅行社成员删除
     * userId (string): 用户ID
     */
    travelAuditUserDelete:'/youyou/travel/audit/user/delete',

    /**
     * 旅行社详情
     * groupId (string, optional): 组别ID ,(12.7)
     * page (integer): 当前显示页，取值范围[1,10000000]。 ,
     * pageSize (integer): 每页显示条数，取值范围[1,100]。 ,
     * travelId (string): 旅行社ID
     */
    travelAuditGet:'/youyou/travel/audit/get',

    /**
     * 证件对应的绑定产品列表查询
     * recordList (Array[Map«string,string»], optional): 证件数据 {"idCard":"350784199502210013","papersType":"01","date":"2019-11-20"] }
     */
    travelAuditItemIdCardBindingList:'/youyou/travel/audit/item/idcard/binding/list',


    /**
     * 特殊证件列表
     */
    travelAuditSpecialDocumentList:'/youyou/travel/audit/special/document/list',


    //Travel-系统设置
    /**
     * 获取系统设置
     */
    systemSettingGet:'/youyou/system/admin/setting/get',
    /**
     * 闭园通知添加
     * content (string): 通知内容
     */
    systemSettingNotifyAdd:'/youyou/system/admin/setting/notify/add',

    /**
     * 闭园通知删除
     * id (string): 通知ID
     */
    systemSettingNotifyDelete:'/youyou/system/admin/setting/notify/delete',

    /**
     * 查询闭园通知列表
     */
    systemSettingNotifyList:'/youyou/system/admin/setting/notify/list',
    /**
     * 更新系统设置
     * excelHint (string, optional): Excel的提示信息 ,
     * notifyReleaseStatus (string, optional): 通知发布状态 ,
     * offEffectiveEndTime (string, optional): 淡季结束时间 ,
     * offEffectiveStartTime (string, optional): 淡季开始时间 ,
     * onEffectiveEndTime (string, optional): 旺季结束时间 ,
     * onEffectiveStartTime (string, optional): 旺季开始时间 ,
     * shopTicketMessage (string, optional): 购票须知 ,
     * submitErrorMessage (string, optional): 提交错误信息 ,
     * submitTime (string, optional): 提交时间 ,
     * teamNumber (string, optional): 成员人数
     */
    systemSettingUpdate:'/youyou/system/admin/setting/update',

    /**
     * 闭园通知修改
     * content (string): 闭员通知内容
     * id (string): 通知ID
     */
    systemSettingNotifyUpdate:'/youyou/system/admin/setting/notify/update',

    /**
     * 身份证地区码列表
     */
    adminTravlAreaCodeList:'/youyou/admin/travel/area/code/list',

    /**
     * 地区码验证
     */
    adminTravlAreaCodeValid: '/youyou/admin/travel/area/code/valid'


  }
}
var url = {
  oauth: 'api_oauth/',
  outer: 'api_outer/',
}

Vue.use(VueResource)

/**
 * 获得Oauth参数
 * @param service
 * @returns {string}
 */
function getOauthParam(service) {
  var args = [];
  args.push(clientId);
  args.push('');
  return args.join(';');
}

/**
 * 获得Outer参数
 * @param {String} service
 * @param {String} token
 * @param {String} body
 * @param {String} sec
 * @returns {string}
 */
function getOuterParam(service, token, body, sec) {
  sec = sec ? 'T' : 'F';
  var args = [];
  var ct = typeof(body) === 'string' ? body : JSON.stringify(body);
  var pa = token.accessToken + [clientId, token.accessTokenKey, service, ct, sec]
    .sort().join('').replace(/\t|\r|\n/g, '') + token.accessToken;
  var sign = CryptoJS.HmacMD5(pa, token.accessToken).toString().toUpperCase();
  args.push(clientId);
  args.push(token.accessTokenKey);
  args.push(sign);
  // args.push(sec);
  args.push('');
  return args.join(';');
}

/**
 * 获取接口参数
 * @param options {object}
 *  options {
 *    type {string} 接口类型 oauth,inner,outer
 *    service {string} 接口 mapKey loginGet:''
 *    ct {object} 请求内容
 *    sec {boolean, ...} 是否加密
 *  }
 *  @param token {object} 令牌
 * @returns {object}
 */
function getApiParam(options, token) {
  var rs = Object.create(null);
  var type = options.type || '';
  var service = options.service || '';
  var token = token || null;
  var ct = options.ct || {};
  var sec = options.sec || false;

  if (typeof url[type] !== 'undefined') {
    rs.url = proxyTable + api[type][service];
  } else {
    console.error('type error, has\'t ' + type + ' api type!');
    return rs;
  }
  if (typeof api[type][service] !== 'undefined') {
    rs.service = api[type][service];
  } else {
    console.error('service error, ' + type + ' has\'t ' + service + ' api service!');
    return rs;
  }
  switch (type) {
    case 'oauth':
      rs.header = getOauthParam(rs.service);
      break;
    case 'outer':
      if (typeof ct !== 'undefined') {
        rs.header = getOuterParam(rs.service, token, ct, sec);
      } else {
        rs.header = '';
      }
      break;
    default:
      break;
  }
  if (rs.header) {
    rs.options = Object.create(null);
    rs.options.headers = Object.create(null);
    rs.options.headers[headerKey] = rs.header;
    rs.options.headers['Accept'] = '*/*';
  }
  // console.log('rs', rs)
  // rs.body = encodeURIComponent(JSON.stringify(ct));
  rs.body = ct
  return rs;
}

/**
 * 获取接口参数
 * @param options {object}
 *  options {
 *    type {string} 接口类型 oauth,inner,outer
 *    service {string} 接口 mapKey loginGet:''
 *    ct {object} 请求内容
 *    sec {boolean, ...} 是否加密
 *  }
 * @returns {object}
 */
function apiSource(options) {
  var self = this
  var token = JSON.parse(localStorage.getItem('booking')) || {}
  console.log('!!@@@@!!!!!!!!!!', token)
  // if(!token.userId){
  //   console.log('请重新登录！', token)
  //   window.location.href = '/#/login'
  //   return
  //   // Toast.error('请重新登录！')
  // }
  var ap = getApiParam(options, token)
  return new Promise((resolve, reject) => {
    Vue.http.post(ap.url, ap.body, ap.options).then((res) => {
      if (isSuccess(res.body)) {
        resolve(parseJSON(res.body))
      } else if (/ERR_/.test(res.body)) {
        var errorJson = JSON.parse(res.body.replace('ERR_{', '{'));
        console.log('!!@@@@errorJson!!!!!!!!!!', errorJson)

        // 判断是否超速，跳转到登录
        if (errorJson.code === '3004') {
          localStorage.clear() //清空localStorage中所有信息
          window.location.href = '/#/login'
          // Toast.error('登录超时，请重新登录！')
          // self.$router.push({path:'/'})
        }
        if(errorJson.msg.length>7){
          if(errorJson.msg.substring(errorJson.msg.length-8)==='相同的记录已存在'){
            Toast('相同的订单已存在')
          } else{
            Toast(errorJson.msg)
          }
        } else{
          Toast(errorJson.msg)
        }

        // if (errorJson.code && errorJson.msg) {
        //   // console.error(errorJson.msg)
        //   Toast(errorJson.msg)
        // }
        reject(errorJson);
      } else {
        reject(parseJSON(res.body))
      }
    }, (res) => {
      if (res.code && res.msg) {
        console.error(res.msg)
        Toast(res.msg)
      }
      reject(res)
    })
  })
}

async function get (options, token) {
  var self = this
  var token = JSON.parse(localStorage.getItem('booking')) || {}
  var ap = getApiParam(options, token)
  // let proxyUrl = ''
  // let proxyHost = window.localStorage.getItem('proxyHost')
  // proxyUrl = proxyHost + url
  // data = encodeURIComponent(JSON.stringify(data))
  return new Promise((resolve, reject) => {
    Vue.http.get(ap.url, ap.body, ap.options).then(function (response) {
      console.log(response)
      // if (!isEmptyObject(response.data)) {
      //   // 正常响应处理
      //   if (response.data.code === 0) {
      //     resolve(response.data.data)
      //   } else {
      //     reject(response.data.msg)
      //   }
      // } else {
      //   resolve(response.data)
      // }
    }).catch(function (error) {
      console.error('请求服务器发生错误：')
      console.error(error)
      reject(error)
    })
  })
}

/**
 * 转码字符串到JSON
 * @param data
 * @returns {*}
 */
function parseJSON(data) {
  // console.log(data, 'ssssssssss', data.substr(0, 1));

  // 解决空格变成加号的问题
  // data = data.replace(/\+/g, "%20");

  // 判断值是否文字符串 返回
  // if (data.substr(0, 1) !== '[' && data.substr(0, 1) !== '{' && data.substr(0, 3) !== 'ERR') {
  //   return data
  // }
  // data = decodeURIComponent(data);
  var rs = null;
  if (typeof data === 'object') {
    return data;
  }
  if (typeof data == 'undefined'
    || (typeof data == 'string' && data == '')
    || data == null) {
    return {
      code: '505',
      msg: '请求错误或服务器错误!'
    };
  }
  if (/ERR_/.test(data)) {
    var tagflex = false
    try {
      var tmpdata = JSON.parse(data)
    } catch (e) {
      tagflex = true
    }
    if (!tagflex) {
      console.log('tmpdata', tmpdata)
      if (tmpdata instanceof Array) {
        for (let i = 0; i < tmpdata.length; i++) {
          let tmpstr = JSON.stringify(tmpdata[i])
          if (tmpstr.indexOf('ERR_') !== -1 && tmpstr.indexOf('msg') !== -1) {
            rs = JSON.parse((tmpstr.slice(tmpstr.indexOf('ERR_') + 4, tmpstr.indexOf('}') + 1)).replace(/\\/g, ''));
          }
        }
      }
    } else {
      rs = JSON.parse(data.substr(4));
    }
  } else {
    if(data.indexOf('{') > -1){
      rs = JSON.parse(data);
    } else{
      rs=data //判断当后端返回格式不为JSON字符串的话不做处理
    }
    console.log('rs2222', rs)
  }
  return rs;
}

/**
 * 判断是否为成功请求
 * @param data
 * @returns {boolean}
 */
function isSuccess(data) {
  var rs = parseJSON(data);
  if (rs instanceof Array) {
    // console.log('!!!!!!!!!!!')
    for (let i = 0; i < rs.length; i++) {
      let tmpstr = JSON.stringify(rs[i])
      if (tmpstr.indexOf('ERR_') !== -1 && tmpstr.indexOf('msg') !== -1) {
        return false
      }
    }
    return true
    // 同时出现code,msg说明服务端响应错误
  } else if (rs.code && rs.msg) {
    return false;
  } else {
    return true;
  }
}


export default apiSource

export {
  apiSource,
  parseJSON,
  isSuccess,
  get
}
